package com.hyt.it.ogt.kq.service.gov.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.kq.common.enums.UserBusinessAccessTypeEnum;
import com.hyt.it.ogt.kq.service.gov.api.ks.model.ExamTaskPageVO;
import com.hyt.it.ogt.kq.service.gov.api.ks.model.QueryExamTaskParam;
import com.hyt.it.ogt.kq.service.gov.api.ks.model.TaskBaseVO;
import com.hyt.it.ogt.kq.service.gov.api.platform.model.param.TaskInfoPageParam;
import com.hyt.it.ogt.kq.service.gov.api.platform.model.vo.TaskInfoPageVO;
import com.hyt.it.ogt.kq.service.gov.api.platform.model.vo.TaskStatisticsVO;
import com.hyt.it.ogt.kq.service.gov.model.entity.Task;
import com.hyt.it.ogt.kq.service.gov.model.param.*;
import com.hyt.it.ogt.kq.service.gov.model.vo.TestClassifyVO;
import com.hyt.it.ogt.kq.service.gov.model.vo.overview.ExamManageCollectVO;
import com.hyt.it.ogt.kq.service.gov.model.vo.task.TaskPageVO;
import com.hyt.loginfo.model.User;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 考试任务表 服务类
 * </p>
 *
 * @author huangyh
 * @since 2021-03-08
 */
public interface ITaskService extends IService<Task> {

    /**
     * 新增考试任务
     *
     * @param json
     * @param officeId
     * @return
     */
    String add(String json, String officeId);

    /**
     * 初始化任务参数-线上模式
     *
     * @param taskId
     * @param officeId
     */
    void initByOnline(String taskId, String officeId) throws Exception;

    /**
     * 初始化考生数据
     *
     * @param taskId
     * @param officeId
     * @throws Exception
     */
    void initTaskData(String taskId, String officeId) throws Exception;

    /**
     * 初始化考生数据
     *
     * @param taskId
     * @param officeId
     * @throws Exception
     */
    void initTaskDataOffline(String taskId, String officeId) throws Exception;

    /**
     * 创建考试任务
     *
     * @param taskParam 考试任务参数
     * @param officeId  机构id
     */
    void add(TaskParam taskParam, String officeId);

    TaskBaseVO getTaskInfoById(String id);

    /**
     * 编辑考试任务
     *
     * @param json
     */
    @Transactional(rollbackFor = Exception.class)
    void update(String json);

    /**
     * 修改考试任务
     *
     * @param taskParam 考试任务参数
     */
    void update(TaskParam taskParam);

    /**
     * 根据任务id查询任务相关的基本信息，创建和编辑时使用。
     *
     * @param taskId
     * @return
     */
    Map<String, Object> query(String taskId);

    /**
     * 查询机构下的默认参数
     *
     * @param officeId
     * @return
     */
    Map<String, Object> defaultTaskConfig(String officeId);

    /**
     * 通过id查询考试任务
     *
     * @param task 考试任务
     * @return 考试任务
     */
    TaskParam query(Task task);

    /**
     * 通过id获取考试任务
     *
     * @param id 考试任务id
     * @return 考试任务
     */
    Task getTaskById(String id);

    /**
     * 查询考试任务分页数据
     *
     * @param pageParam 分页参数
     * @param officeId  机构ID
     * @param deptIds   部门ID集合
     * @return 分页数据
     */
    Page<TaskPageVO> page(TaskPageParam pageParam, String officeId, Set<String> deptIds);

    /**
     * 获取考试任务分页数据
     *
     * @param taskInfoPageParam 分页参数
     * @return 分页数据
     */
    Page<TaskInfoPageVO> page(TaskInfoPageParam taskInfoPageParam);

    /**
     * 考试端拉取考务人员任务
     *
     * @param queryExamTaskParam
     * @return
     */
    Page<ExamTaskPageVO> getExamTask(QueryExamTaskParam queryExamTaskParam);

    /**
     * 通过考试任务编号获取考试任务
     *
     * @param code 考试任务编号
     * @return 考试任务
     */
    Task getTaskByCode(String code);

    /**
     * 通过考试任务id获取考试任务
     *
     * @param id 考试任务id
     * @return 考试任务
     */
    Task getById(String id);

    /**
     * 通过考试任务编号校验考试任务是否在有效期内
     *
     * @param code 考试任务编号
     * @return 考试任务是否在有效期内，true：是，false：否
     */
    Boolean activeTaskByCode(String code);

    /**
     * 修改任务发布状态
     *
     * @param taskPublishParam
     */
    void updateTaskPublishStatus(TaskPublishParam taskPublishParam);

    /**
     * 通过考试任务编号获取考试任务发布状态
     *
     * @param taskCode 考试任务编号
     * @return 考试任务发布状态，true：已发布，false：未发布或考试任务不存在
     */
    Boolean getPublishByCode(String taskCode);

    /**
     * 通过考试任务编号获取考试任务名称
     *
     * @param taskCode 考试任务编号
     * @return 考试任务名称
     */
    Task getNameByCode(String taskCode);

    /**
     * 复制任务
     *
     * @param copyTaskParam 复制任务参数
     */
    void copyTask(CopyTaskParam copyTaskParam);

    /**
     * 检查是否已编排锁定
     *
     * @param taskId
     */
    void isLockDataThrowException(String taskId);

    /**
     * 检查是否已编排锁定
     *
     * @param taskId
     */
    void isLockDataThrowForImport(String taskId);

    void isLockDataThrowException(Task task);

    /**
     * 检查是否没有已编排锁定
     *
     * @param taskId
     */
    void isNotLockDataThrowException(String taskId);

    void isNotLockDataThrowException(Task task);

    /**
     * 根据任务id获取当前数据状态
     *
     * @param taskId
     * @return
     */
    Integer taskDataType(String taskId);

    /**
     * 据任务获取当前数据状态
     *
     * @param task
     * @return
     */
    Integer taskDataType(Task task);

    /**
     * 检测是否绑定了报名
     *
     * @param taskId
     */
    void checkBindBm(String taskId);

    /**
     * 检测是否绑定了报名
     *
     * @param taskId
     */
    void checkBindBmForImport(String taskId);

    /**
     * 更新数据锁定状态
     *
     * @param taskId   考试任务id
     * @param dataLock 锁定状态：false：未锁定，true：锁定
     */
    void updateDataLock(String taskId, Boolean dataLock);

    /**
     * 获取考试管理数据
     *
     * @param taskId
     * @return
     */
    ExamManageCollectVO getExamManageData(String taskId);

    /**
     * 一键清除机构模板数据
     *
     * @param officeId
     */
    @Transactional(rollbackFor = Exception.class)
    void cleanOfficeData(String officeId);

    /**
     * 获取任务考试类型
     *
     * @param taskId 考试任务id
     * @return 任务考试类型
     */
    String getExamType(String taskId);

    /**
     * 获取考试分类
     *
     * @return
     */
    List<TestClassifyVO> getTestClassify();

    /**
     * 获取线上考试任务
     *
     * @param taskId
     * @return
     */
    OnlineTaskParam getOnlineTask(String taskId);

    /**
     * 获取任务配置，包含线上和线下
     *
     * @param taskId
     * @param officeId
     * @return
     */
    TaskInfoParam getTaskInfoParam(String taskId, String officeId);

    /**
     * 新增和编辑任务配置，包含线上和线下模式
     *
     * @param taskInfoParam
     * @param loginUser
     * @return
     */
    String addOrUpdateTaskConfig(TaskInfoParam taskInfoParam) throws Exception;

    /**
     * 保存任务业务权限
     *
     * @param currentLoginUser
     * @param taskId
     * @param userIds
     * @param businessAccessTypeEnum
     */
    void saveTaskBusinessAccess(User currentLoginUser, String taskId, List<String> userIds, UserBusinessAccessTypeEnum businessAccessTypeEnum);

    /**
     * 更新任务报名字段
     *
     * @param taskId
     * @param taskBmId
     */
    void updateTaskBmId(String taskId, String taskBmId);

    /**
     * 获取考试任务对应的报名id
     *
     * @param taskId 考试任务
     * @return 考试任务对应的报名id
     */
    String getTaskSignUpId(String taskId);

    /**
     * 根据报名id获取考试任务id
     *
     * @param signUpId 报名id
     * @return 考试任务id
     */
    String getIdBySignUpId(String signUpId);

    /**
     * 绑定平台项目
     *
     * @param taskIds 考试任务id，多个用英文逗号分隔
     */
    void bindPlatform(String taskIds);

    /**
     * 解除绑定平台项目
     *
     * @param taskIds 考试任务id，多个用英文逗号分隔
     */
    void unbindPlatform(String taskIds);

    /**
     * 根据考试任务id获取考试任务统计信息
     *
     * @param taskIds 考试任务id，多个用英文逗号分隔
     * @return 考试任务统计信息
     */
    List<TaskStatisticsVO> listTaskStatistics(String taskIds);


    /**
     * 根据条件查询任务列表
     * limit 限制数量
     */
    List<Task> getTaskListLimit(Integer limit);

    /**
     * 是否报名导入的任务
     *
     * @param taskId
     * @return
     */
    boolean isBmImport(String taskId);

    /**
     * 是否发布
     *
     * @param taskId
     * @return
     */
    boolean isPublish(String taskId);

    /**
     * 删除考务任务
     *
     * @param taskId 考试任务ID
     * @return
     */
    Boolean deleteTask(String taskId);

    void isPublishAndDataLockThrowException(String taskId);
}
